if __name__ == "__main__":
    # 步骤1：生成模拟Iris数据集
    data = generate_iris_data()
    # 步骤2：设置聚类参数并运行k-means
    k = 3  # Iris数据集对应3个簇
    max_iters = 100
    tol = 1e-6
    print(f"\n开始运行k-means（k={k}，最大迭代次数={max_iters}，收敛阈值={tol}）")
    labels, centers = k_means(data, k, max_iters, tol)
    # 步骤3：计算并输出簇内平方和（WCSS）
    wcss = calculate_wcss(data, labels, centers)
    # 步骤4：输出最终结果
    print("\n" + "=" * 60)
    print("k-means聚类最终结果")
    print("=" * 60)
    # 输出聚类中心
    print("1. 最终聚类中心（4个特征，单位：cm）：")
    feature_names = ["萼片长度", "萼片宽度", "花瓣长度", "花瓣宽度"]
    for i, center in enumerate(centers):
        print(f"   簇{i + 1}中心：", end="")
        for j, (feat_name, val) in enumerate(zip(feature_names, center)):
            print(f" {feat_name}={val:.4f}", end="")
        print()
    # 输出簇内平方和
    print(f"\n2. 簇内平方和（WCSS）：{wcss}")
    # 输出各簇样本数量
    print(f"\n3. 各簇样本数量：")
    cluster_counts = [labels.count(i) for i in range(k)]
    for i, count in enumerate(cluster_counts):
        print(f"   簇{i + 1}：{count} 个样本")
    # 输出前15个样本的簇分配（验证Setosa簇分类效果）
    print(f"\n4. 前15个样本的簇分配（真实为Setosa簇，应集中在同一簇）：")
    for i in range(15):
        print(f"   样本{i + 1}：特征={[round(x, 2) for x in data[i]]} → 簇{labels[i] + 1}")